package cn.usersmsg.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import org.junit.Test;
/**
 * 文件输入输出操作
 * @author 张东辉
 */
public class IOFile {
	@Test
	public void test(){
//		createNewFile("d:/IOFile/test.txt");
//		deleteFile("d:/IOFile/test.txt");
//		fileLists("F:/");
//		fileList("F:/");
//		randomAccessFile();
	}
	/**
	 * 指定任意为位置创建文件(路径不存在会自动生成路径)
	 * @param filePath  文件路径(盘名:/../../文件名.格式)
	 */
	public void createNewFile(String filePath){
		File f = null;
		StringBuffer sb = new StringBuffer();
		String [] str =filePath.split("/");
		for (int i = 0; i < str.length; i++) {  //去除掉最后一个文件名  获得路径目录名
			if (i!=str.length-1) {
				sb.append(str[i]+"/");
			}			
		}
		f = new File(sb.toString());
		if (!f.exists()) {  //判断目录是否存在 不存在 则创建
			f.mkdirs();
		}
		sb.append(str[str.length-1]);  //追加上文件名 获得全路径
		f = new File(sb.toString());
		if (f.exists()) {  //判断文件是否存在 存在则删除
			f.delete();
		}else{
			try {
				f.createNewFile();
				System.out.println("成功创建文件"+str[str.length-1]);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 删除指定文件
	 * @param filePath
	 */
	public void deleteFile(String filePath){
		File f = null;
		f = new File(filePath);
		if (f.exists()) {
			f.delete();
			System.out.println("成功删除文件");
		}else{
			System.out.println("删除失败,指定文件不存在");
		}
	}
	/**
	 * 给出目录路径名 列出目录下所有文件 (要有足够权限 加锁文件会出错)
	 * @param path
	 */
	public void fileLists(String path){
		File f = new File(path);
		if(!f.exists()||!f.isDirectory()) return;  //若不是目录 或者不存在 则返回
		File [] fs = f.listFiles();  //获取目录里所有  列出指定目录的全部File对象
		if (fs.length!=0) {		//如果目录里不为空  则继续往下找
			for (int i = 0; i < fs.length; i++) {
				if (fs[i].isFile()) {
					System.out.println(path+" "+fs[i].getName()+"\t"+fs[i].length());
				}else {
					System.out.println(path+" "+fs[i].getName()+"\t<dir>");
					fileLists(fs[i].getPath());//如果是目录重新调用本方法（递归）
				}
			}
		}else{
			System.out.println(f.getName()+"是空目录");
		}
	}
	/**
	 * 列出给定目录的子文件名
	 * @param path
	 */
	public void fileList(String path){
		File f = new File(path);
		if (!f.isDirectory()||!f.exists()) return;
		String [] fs = f.list();
		if (fs.length!=0) {
			for (int i = 0; i < fs.length; i++) {
				System.out.println(path+" "+fs[i]);
			}
		}else {
			System.out.println(path+"是空目录");
		}
	}
	public void randomAccessFile(){
		RandomAccessFile raf =null;
			try {
				raf = new RandomAccessFile("d:/IOFile/test.txt","rw");
				System.out.println(raf.length());
				raf.seek(raf.length());//获取当前文件长度  设置指针偏移量
				String name="发生的规定";
//				Integer age = 2;
				raf.write(name.getBytes());
//				raf.writeUTF(name);
				System.out.println(raf.length());
//				raf.write(age.byteValue());
				byte [] names = new byte [1024];
				raf.seek(0);
				int count = raf.read(names);
				System.out.println(count);
				System.out.println(new String(names));
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
}
